package org.dreamwork.jasmine2.editor;

import org.dreamwork.util.VirtualFile;

import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 * Created with IntelliJ IDEA.
 * User: seth.yang
 * Date: 14-3-5
 * Time: 下午6:12
 */
public interface IResourceFetcher {
    int SELECTION_MODE_SINGLE = 0;
    int SELECTION_MODE_MULTI = 1;

    /**
     * 根据资源路径，返回该路径下的所有可用资源列表
     * @param contextPath Web 的映射目录
     * @param path 资源路径
     * @param parameters 额外参数 该参数可能为空
     * @return 返回的资源列表，代理 Servlet 将会把这个返回列表编码成 json 格式输出到客户端
     */
    List<Map<String, Object>> getResourceList (String contextPath, String path, Map<String, Object> parameters) throws IOException;

    /**
     * 根据 resourceName 获取单个资源的内容，以 java.io.InputStream 形式返回
     * @param resourceName 资源名称
     * @return 资源内容
     */
    InputStream getResource (String resourceName);

    /**
     * 对于私有资源，处理 Servlet 将统一以 private 作为资源路径的根目录，实现类应该有自己的算法，将 private
     * 转化为系统当前用户的私有目录
     * @param session 存放系统当前用户的 HttpSession 容器
     * @return 转换后的 private 所对应的系统当前用户的私有目录名称
     */
    String getPrivateFolderName (HttpSession session);

    /**
     * 对于公共资源，处理 Servlet 将统一以 public 作为资源路径的根目录. 实现类应该有自己的算法，将 public
     * 转换为系统当前用户的公共目录
     * @return 转换以后的 public 所对应的系统当前用户的公共目录名称
     */
    String getPublicFolderName ();

    /**
     * 是否支持所有用户都有权限访问的公共目录.
     * 处理 Servlet 使用 public 来标注公共目录，实现类必须能够理解这个 public 字面量，以便在存取资源时能够做出
     * 正确的响应
     * @return true - 支持公共目录，否则返回 false
     */
    boolean isPublicFolderSupported (HttpSession session);

    /**
     * 保存资源.
     *
     * {@link #save(org.dreamwork.util.VirtualFile, String, java.util.Map) save (Virtual, String, Map)} 的简化版
     *
     * @param file 用户上传的资源虚拟文件
     * @param path 以 public 或 private 开头的资源存放目录映射
     * @return 保存后的文件名
     */
    String save (VirtualFile file, String path);

    /**
     * 保存资源.
     * @param file 用户上传的资源虚拟文件
     * @param path 以 public 或 private 开头的资源存放目录映射
     * @param params 额外的参数
     * @return 保存后的文件名
     */
    String save (VirtualFile file, String path, Map<String, Object> params);

    /**
     * 创建目录.
     *
     * 实现类应该在该方法内部调用 {@link #canCreateFolder(javax.servlet.http.HttpSession)} 方法，已确认允许
     * 用户创建目录
     *
     * @param folder 目录全路径，相对于 basedir
     * @return 成功 - true, 否则返回 false
     */
    String createFolder (String folder) throws IOException;

    /**
     * 返回选择模式
     * @return  选择模式，可能的值为：SELECTION_MODE_SINGLE - 单选
     *                            SELECTION_MODE_MULTI - 多选
     */
    int getSelectionMode ();
//    void setSelectionMode (int mode);

    /**
     * 是否允许用户创建目录
     * @param session HttpSession
     * @return 能：true, 否则返回 false
     */
    boolean canCreateFolder (HttpSession session);

    /**
     * 是否允许用户删除项目（包括目录和图片）
     * @param session HttpSession
     * @return 允许,返回 true, 否则返回 false
     */
    boolean canRemoveItem (HttpSession session);

    /**
     * 删除项目
     *
     * 实现类应该在该方法内部调用 {@link #canRemoveItem(javax.servlet.http.HttpSession) canRemoveItem} 来验证是否允许
     * 删除项目.
     * 项目列表中都是以 public 和/或 private 开头的“绝对”路径，实现类应该能够处理该路径
     *
     * @param items 要删除的项目
     */
    void remove (String... items);

    /**
     * 返回资源的最后修改时间.
     *
     * 若无法确定资源的最后修改时间，或，资源为动态资源，应返回负值
     * @param resourceName 资源名称
     * @return 指定支援的最后修改时间戳
     */
    long getLastModified (String resourceName);
}